package dca.sistemascontrole.malhadecontrole;

import dca.sistemascontrole.domain.VariaveisDeControle;
import dca.sistemascontrole.travas.GerenciadorDeTravas;

/**
 *
 * @author Rafael
 */
public abstract class MalhaDeControle {

    public static final int MALHA_ABERTA = 1;
    public static final int MALHA_FECHADA = 2;
    public static final int MALHA_CASCATA = 3;
    protected VariaveisDeControle variaveisDeControle;

    
    public MalhaDeControle() {
        variaveisDeControle = new VariaveisDeControle();
    }

    public abstract int getTipo();

    public VariaveisDeControle getValorEscrita(double nivelTanqueSuperior, double nivelTanqueInfeior, long t) {
        VariaveisDeControle variaveisDeControle = getNextValue(t, nivelTanqueSuperior, nivelTanqueInfeior);
        double uSaturado = GerenciadorDeTravas.ajustarAsTravas(nivelTanqueSuperior, variaveisDeControle.getU());

        variaveisDeControle.setuSaturado(uSaturado);
        return variaveisDeControle;
    }

    protected abstract VariaveisDeControle getNextValue(long t, double nivelTanqueSuperior, double nivelTanqueInfeior);

    public static boolean isMalhaAberta(int tipo) {
        return (tipo & MalhaDeControle.MALHA_ABERTA) == MalhaDeControle.MALHA_ABERTA;
    }

    public static boolean isMalhaFechada(int tipo) {
        return (tipo & MalhaDeControle.MALHA_FECHADA) == MalhaDeControle.MALHA_FECHADA;
    }

    public static boolean isMalhaCascata(int tipo) {
        return (tipo & MalhaDeControle.MALHA_CASCATA) == MalhaDeControle.MALHA_CASCATA;
    }
}
